import cv2
import numpy as np

img = cv2.imread("../images/shudu.png", cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5)

# 使用Sobel算子进行边缘提取
# 1. 计算水平梯度
grad_x = cv2.Sobel(img, -1, 1, 0)
# 2. 计算垂直梯度
grad_y = cv2.Sobel(img, -1, 0, 1)
# 3. 合并梯度
grad = cv2.addWeighted(grad_x, 0.5, grad_y, 0.5, 0)

img_stack = np.hstack([img, grad_x, grad_y, grad])
cv2.imshow("img_stack", img_stack)
cv2.waitKey(0)

# 使用Sobel的加强版Scharr算子进行边缘提取
grad_x = cv2.Scharr(img, -1, 1, 0)
grad_y = cv2.Scharr(img, -1, 0, 1)
grad = cv2.addWeighted(grad_x, 0.5, grad_y, 0.5, 0)
img_stack = np.hstack([img, grad_x, grad_y, grad])
cv2.imshow("img_stack", img_stack)
cv2.waitKey(0)

# 使用Laplacian算子进行边缘提取
# 注意： Laplacian算子的卷积核和中已包含水平方向和垂直方向的梯度，因此不需要再计算水平梯度和垂直梯度，在函数中无需指定 dx和dy参数
img_laplacian = cv2.Laplacian(img,
                              -1,
                              ksize=3)
img_stack = np.hstack([img, img_laplacian])
cv2.imshow("img_stack", img_stack)
cv2.waitKey(0)